Nate Breznau
Hung H.V. Nguyen

Setup

Our app is built so far as a set of functions. The file 00_Run_Theory.R loads all of these functions into the environment.


source(here::here("00_Run_Theory.R"))
theoRy v0.1
Breznau, Nate and Hung H.V. Nguyen
function build_causal_matrix loaded
function build_formula_matrix loaded
function build_dag_matrix loaded
function identify_compatible loaded
function plot_dag_matrix loaded

Build Causal Matrix

A theoRy causal matrix includes all possible causal configurations of the variables supplied as input. Currently this is limited to 5 total variables. The user places the variables ordinally in time. Then the algorithm creates every possible causal model, such that every path is either causal or not causal, and simultaneously occuring variables are either not related or have a residual correlation.

The inputs object:

The object ‘inputs’ takes the form of a named list.

In the ’inputs list:

  1. Nodes can be given any alpha-numeric naming convention, but for plotting and comparison will be transformed into X1-Xn based on the timing.

  2. Timing requires entering integers from 0 backwards. Zero should be given to the outcome (otc) variable and all other independent variables need to be chronologically ordered. Not real time, but ordinal timing of events. It is possible for variables to occur simultaneously, even if this is just observationally)

  3. Types include “test”, “otc”, or “ctr”.

    1. “ctr” is a control or adjustment variable that is not the test variable in question
    2. “test” is the test variable in question, treatment for example.
    3. “otc” is the outcome, dependent variable.

The Causal Matrix output

The output of the causal matrix has one row per node dyad, and is grouped by model.

{r ![causal_matrix example](here::here("Media", "Causal_Matrix_Example.png"))}

The function also outputs a summary of all variables, their labels and their timing for the user.

Example Code


inputs <- list(nodes=c("a","b","c","d","e"), timing=c(0,-1,-2,-3,-3),
              types=c("otc","test","ctr","ctr","ctr"))

causal_matrix <- build_causal_matrix(inputs)
VARIABLE SUMMARY
Y. Label = a. Timing = 0
Xtest. Label = b. Timing = -1
X1. Label = d. Timing = -3
X2. Label = e. Timing = -3
X3. Label = c. Timing = -2

Build Formula Matrix

The formula matrix contains lavaan style formulas to express the causal models. This matrix has one model per row.

lavaan style formulas take on the style of the following example, which is the first model (Model 1) in the example formula_matrix:

Y ~ X1 + X2 + X3 + Xtest + Y X3 ~ X1 + X2 + X3 Xtest ~ X1 + X2 + X3 + Xtest X1 ~ X1 X2 ~ X2 X2 ~~ X1

Where each variable that has a causal path coming into it has its own equation signified by ~. For more information see lavaan documentation.

[To develop further] The lavaan formulas in our usage contain redundancies, for example the DVs are present on the right-hand sides of the equation.

The formula matrix also identifies any minimal adjustment sets (MAS). Add citation here.


formula_matrix <- build_formula_matrix(causal_matrix)

Keep minimal

This function may be retired.

Remove Xs which do not belong to the MAS from each model and remove duplicated models deriving from this action

reduced_causal_matrix <- keep_minimal(formula_matrix, causal_matrix)
reduced_formula_matrix <- build_formula_matrix(reduced_causal_matrix)

Build Dag Matrix

This function converts lavaan style formulas into daggity objects. The daggity package has its own format for storing objects. This format may include information about where to plot the nodes. For example Model 1:

dag { X1 [pos=“-1.250,1.000”] X2 [pos=“-1.250,-0.500”] X3 [pos=“-0.500,-1.000”] Xtest [exposure,pos=“0.250,0.000”] Y [outcome,pos=“1.000,0.000”] X1 -> X1 X1 -> X3 X1 -> Xtest X1 -> Y X1 <-> X2 X2 -> X2 X2 -> X3 X2 -> Xtest X2 -> Y X3 -> X3 X3 -> Xtest X3 -> Y Xtest -> Xtest Xtest -> Y Y -> Y }

These objects are ideal for dagitty functions and for plotting.

This function also stores the minimum X value for later plotting purposes in Results/minX.RDS.


dag_matrix <- build_dag_matrix(formula_matrix)

Plot DAG Matrix

This function takes the dagitty objects in dag_matrix and plots them with a title and MAS. All plots are stored in a list using recordPlot(). This allows the user to quickly recall any plot.

The save_plots option when switched to TRUE, will save every plot as a .png file in the Results folder.

The title option is TRUE by default and displays the “Model #” where # refers to the row in the dag_matrix

The title_pos option should be a number from 0 (furthest left in the graph) to the highest value, which depends on how wide the plot is (usually not higher than 2) with a default of 0.5

dag_plots <- plot_dag_matrix(dag_matrix, save_plots = F)

Colophon

sessionInfo()

References

packages %>%
  map(citation) %>%
  print(style = "text")
LS0tDQp0aXRsZTogIjAxIHRoZW9SeSBVc2VyIEluc3RydWN0aW9ucyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCk5hdGUgQnJlem5hdSA8YnI+DQpIdW5nIEguVi4gTmd1eWVuDQoNCiMjIFNldHVwDQoNCk91ciBhcHAgaXMgYnVpbHQgc28gZmFyIGFzIGEgc2V0IG9mIGZ1bmN0aW9ucy4gVGhlIGZpbGUgMDBfUnVuX1RoZW9yeS5SIGxvYWRzIGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgaW50byB0aGUgZW52aXJvbm1lbnQuDQoNCmBgYHtyIHNldHVwLCB3YXJuaW5nID0gRn0NCg0Kc291cmNlKGhlcmU6OmhlcmUoIjAwX1J1bl9UaGVvcnkuUiIpKQ0KDQpgYGANCg0KIyMgQnVpbGQgQ2F1c2FsIE1hdHJpeA0KDQpBIHRoZW9SeSBjYXVzYWwgbWF0cml4IGluY2x1ZGVzIGFsbCBwb3NzaWJsZSBjYXVzYWwgY29uZmlndXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBzdXBwbGllZCBhcyBpbnB1dC4gQ3VycmVudGx5IHRoaXMgaXMgbGltaXRlZCB0byA1IHRvdGFsIHZhcmlhYmxlcy4gVGhlIHVzZXIgcGxhY2VzIHRoZSB2YXJpYWJsZXMgb3JkaW5hbGx5IGluIHRpbWUuIFRoZW4gdGhlIGFsZ29yaXRobSBjcmVhdGVzIGV2ZXJ5IHBvc3NpYmxlIGNhdXNhbCBtb2RlbCwgc3VjaCB0aGF0IGV2ZXJ5IHBhdGggaXMgZWl0aGVyIGNhdXNhbCBvciBub3QgY2F1c2FsLCBhbmQgc2ltdWx0YW5lb3VzbHkgb2NjdXJpbmcgdmFyaWFibGVzIGFyZSBlaXRoZXIgbm90IHJlbGF0ZWQgb3IgaGF2ZSBhIHJlc2lkdWFsIGNvcnJlbGF0aW9uLiANCg0KIyMjICpUaGUgaW5wdXRzIG9iamVjdCo6DQoNClRoZSBvYmplY3QgJ2lucHV0cycgdGFrZXMgdGhlIGZvcm0gb2YgYSBuYW1lZCBsaXN0LiANCg0KSW4gdGhlICdpbnB1dHMgbGlzdDoNCg0KMS4gTm9kZXMgY2FuIGJlIGdpdmVuIGFueSBhbHBoYS1udW1lcmljIG5hbWluZyBjb252ZW50aW9uLCBidXQgZm9yIHBsb3R0aW5nIGFuZCBjb21wYXJpc29uIHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byBYMS1YbiBiYXNlZCBvbiB0aGUgdGltaW5nLg0KDQoyLiBUaW1pbmcgcmVxdWlyZXMgZW50ZXJpbmcgaW50ZWdlcnMgZnJvbSAwIGJhY2t3YXJkcy4gWmVybyBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhlIG91dGNvbWUgKG90YykgdmFyaWFibGUgYW5kIGFsbCBvdGhlciBpbmRlcGVuZGVudCB2YXJpYWJsZXMgbmVlZCB0byBiZSBjaHJvbm9sb2dpY2FsbHkgb3JkZXJlZC4gTm90IHJlYWwgdGltZSwgYnV0IG9yZGluYWwgdGltaW5nIG9mIGV2ZW50cy4gSXQgaXMgcG9zc2libGUgZm9yIHZhcmlhYmxlcyB0byBvY2N1ciBzaW11bHRhbmVvdXNseSwgZXZlbiBpZiB0aGlzIGlzIGp1c3Qgb2JzZXJ2YXRpb25hbGx5KQ0KDQozLiBUeXBlcyBpbmNsdWRlICJ0ZXN0IiwgIm90YyIsIG9yICJjdHIiLiANCiAgICBhLiAiY3RyIiBpcyBhIGNvbnRyb2wgb3IgYWRqdXN0bWVudCB2YXJpYWJsZSB0aGF0IGlzIG5vdCB0aGUgdGVzdCB2YXJpYWJsZSBpbiBxdWVzdGlvbg0KICAgIGIuICJ0ZXN0IiBpcyB0aGUgdGVzdCB2YXJpYWJsZSBpbiBxdWVzdGlvbiwgdHJlYXRtZW50IGZvciBleGFtcGxlLg0KICAgIGMuICJvdGMiIGlzIHRoZSBvdXRjb21lLCBkZXBlbmRlbnQgdmFyaWFibGUuDQoNCiMjIyAqVGhlIENhdXNhbCBNYXRyaXggb3V0cHV0Kg0KDQpUaGUgb3V0cHV0IG9mIHRoZSBjYXVzYWwgbWF0cml4IGhhcyBvbmUgcm93IHBlciBub2RlIGR5YWQsIGFuZCBpcyBncm91cGVkIGJ5IG1vZGVsLiANCg0KYHtyICFbY2F1c2FsX21hdHJpeCBleGFtcGxlXShoZXJlOjpoZXJlKCJNZWRpYSIsICJDYXVzYWxfTWF0cml4X0V4YW1wbGUucG5nIikpfWANCg0KVGhlIGZ1bmN0aW9uIGFsc28gb3V0cHV0cyBhIHN1bW1hcnkgb2YgYWxsIHZhcmlhYmxlcywgdGhlaXIgbGFiZWxzIGFuZCB0aGVpciB0aW1pbmcgZm9yIHRoZSB1c2VyLg0KDQojIyMgRXhhbXBsZSBDb2RlDQoNCmBgYHtyIGNhdXNhbF9tYXRyaXh9DQoNCmlucHV0cyA8LSBsaXN0KG5vZGVzPWMoImEiLCJiIiwiYyIsImQiLCJlIiksIHRpbWluZz1jKDAsLTEsLTIsLTMsLTMpLA0KICAgICAgICAgICAgICB0eXBlcz1jKCJvdGMiLCJ0ZXN0IiwiY3RyIiwiY3RyIiwiY3RyIikpDQoNCmNhdXNhbF9tYXRyaXggPC0gYnVpbGRfY2F1c2FsX21hdHJpeChpbnB1dHMpDQpgYGANCg0KDQojIyBCdWlsZCBGb3JtdWxhIE1hdHJpeA0KDQpUaGUgZm9ybXVsYSBtYXRyaXggY29udGFpbnMgbGF2YWFuIHN0eWxlIGZvcm11bGFzIHRvIGV4cHJlc3MgdGhlIGNhdXNhbCBtb2RlbHMuIFRoaXMgbWF0cml4IGhhcyBvbmUgbW9kZWwgcGVyIHJvdy4NCg0KbGF2YWFuIHN0eWxlIGZvcm11bGFzIHRha2Ugb24gdGhlIHN0eWxlIG9mIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2hpY2ggaXMgdGhlIGZpcnN0IG1vZGVsIChNb2RlbCAxKSBpbiB0aGUgZXhhbXBsZSBmb3JtdWxhX21hdHJpeDoNCg0KWSB+IFgxICsgWDIgKyBYMyArIFh0ZXN0ICsgWSANClgzIH4gWDEgKyBYMiArIFgzIA0KWHRlc3QgfiBYMSArIFgyICsgWDMgKyBYdGVzdCANClgxIH4gWDENClgyIH4gWDINClgyIH5+IFgxDQoNCldoZXJlIGVhY2ggdmFyaWFibGUgdGhhdCBoYXMgYSBjYXVzYWwgcGF0aCBjb21pbmcgaW50byBpdCBoYXMgaXRzIG93biBlcXVhdGlvbiBzaWduaWZpZWQgYnkgfi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIFtsYXZhYW5dKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9sYXZhYW4vbGF2YWFuLnBkZikgZG9jdW1lbnRhdGlvbi4NCg0KW1RvIGRldmVsb3AgZnVydGhlcl0gVGhlIGxhdmFhbiBmb3JtdWxhcyBpbiBvdXIgdXNhZ2UgY29udGFpbiByZWR1bmRhbmNpZXMsIGZvciBleGFtcGxlIHRoZSBEVnMgYXJlIHByZXNlbnQgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZXMgb2YgdGhlIGVxdWF0aW9uLg0KDQpUaGUgZm9ybXVsYSBtYXRyaXggYWxzbyBpZGVudGlmaWVzIGFueSBtaW5pbWFsIGFkanVzdG1lbnQgc2V0cyAoTUFTKS4gQWRkIGNpdGF0aW9uIGhlcmUuDQoNCmBgYHtyIGZvcm11bGFfbWF0cml4fQ0KDQpmb3JtdWxhX21hdHJpeCA8LSBidWlsZF9mb3JtdWxhX21hdHJpeChjYXVzYWxfbWF0cml4KQ0KDQpgYGANCg0KIyMgS2VlcCBtaW5pbWFsDQoNClRoaXMgZnVuY3Rpb24gbWF5IGJlIHJldGlyZWQuIA0KDQpSZW1vdmUgWHMgd2hpY2ggZG8gbm90IGJlbG9uZyB0byB0aGUgTUFTIGZyb20gZWFjaCBtb2RlbCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZWQgbW9kZWxzIGRlcml2aW5nIGZyb20gdGhpcyBhY3Rpb24NCg0KYGBge3Iga2VlcF9taW5pbWFsfQ0KcmVkdWNlZF9jYXVzYWxfbWF0cml4IDwtIGtlZXBfbWluaW1hbChmb3JtdWxhX21hdHJpeCwgY2F1c2FsX21hdHJpeCkNCnJlZHVjZWRfZm9ybXVsYV9tYXRyaXggPC0gYnVpbGRfZm9ybXVsYV9tYXRyaXgocmVkdWNlZF9jYXVzYWxfbWF0cml4KQ0KDQpgYGANCg0KIyMgQnVpbGQgRGFnIE1hdHJpeA0KDQpUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGxhdmFhbiBzdHlsZSBmb3JtdWxhcyBpbnRvIGRhZ2dpdHkgb2JqZWN0cy4gVGhlIGRhZ2dpdHkgcGFja2FnZSBoYXMgaXRzIG93biBmb3JtYXQgZm9yIHN0b3Jpbmcgb2JqZWN0cy4gVGhpcyBmb3JtYXQgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdG8gcGxvdCB0aGUgbm9kZXMuIEZvciBleGFtcGxlIE1vZGVsIDE6DQoNCmRhZyB7DQpYMSBbcG9zPSItMS4yNTAsMS4wMDAiXQ0KWDIgW3Bvcz0iLTEuMjUwLC0wLjUwMCJdDQpYMyBbcG9zPSItMC41MDAsLTEuMDAwIl0NClh0ZXN0IFtleHBvc3VyZSxwb3M9IjAuMjUwLDAuMDAwIl0NClkgW291dGNvbWUscG9zPSIxLjAwMCwwLjAwMCJdDQpYMSAtPiBYMQ0KWDEgLT4gWDMNClgxIC0+IFh0ZXN0DQpYMSAtPiBZDQpYMSA8LT4gWDINClgyIC0+IFgyDQpYMiAtPiBYMw0KWDIgLT4gWHRlc3QNClgyIC0+IFkNClgzIC0+IFgzDQpYMyAtPiBYdGVzdA0KWDMgLT4gWQ0KWHRlc3QgLT4gWHRlc3QNClh0ZXN0IC0+IFkNClkgLT4gWQ0KfQ0KDQpUaGVzZSBvYmplY3RzIGFyZSBpZGVhbCBmb3IgZGFnaXR0eSBmdW5jdGlvbnMgYW5kIGZvciBwbG90dGluZy4NCg0KVGhpcyBmdW5jdGlvbiBhbHNvIHN0b3JlcyB0aGUgbWluaW11bSBYIHZhbHVlIGZvciBsYXRlciBwbG90dGluZyBwdXJwb3NlcyBpbiBSZXN1bHRzL21pblguUkRTLg0KDQpgYGB7ciBidWlsZF9kYWdfbWF0cml4fQ0KDQpkYWdfbWF0cml4IDwtIGJ1aWxkX2RhZ19tYXRyaXgoZm9ybXVsYV9tYXRyaXgpDQoNCmBgYA0KDQojIyBQbG90IERBRyBNYXRyaXgNCg0KVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgZGFnaXR0eSBvYmplY3RzIGluIGRhZ19tYXRyaXggYW5kIHBsb3RzIHRoZW0gd2l0aCBhIHRpdGxlIGFuZCBNQVMuIEFsbCBwbG90cyBhcmUgc3RvcmVkIGluIGEgbGlzdCB1c2luZyByZWNvcmRQbG90KCkuIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIHF1aWNrbHkgcmVjYWxsIGFueSBwbG90Lg0KDQpUaGUgKnNhdmVfcGxvdHMqIG9wdGlvbiB3aGVuIHN3aXRjaGVkIHRvIFRSVUUsIHdpbGwgc2F2ZSBldmVyeSBwbG90IGFzIGEgLnBuZyBmaWxlIGluIHRoZSBSZXN1bHRzIGZvbGRlci4NCg0KVGhlICp0aXRsZSogb3B0aW9uIGlzIFRSVUUgYnkgZGVmYXVsdCBhbmQgZGlzcGxheXMgdGhlICJNb2RlbCAjIiB3aGVyZSAjIHJlZmVycyB0byB0aGUgcm93IGluIHRoZSBkYWdfbWF0cml4DQoNClRoZSAqdGl0bGVfcG9zKiBvcHRpb24gc2hvdWxkIGJlIGEgbnVtYmVyIGZyb20gMCAoZnVydGhlc3QgbGVmdCBpbiB0aGUgZ3JhcGgpIHRvIHRoZSBoaWdoZXN0IHZhbHVlLCB3aGljaCBkZXBlbmRzIG9uIGhvdyB3aWRlIHRoZSBwbG90IGlzICh1c3VhbGx5IG5vdCBoaWdoZXIgdGhhbiAyKSB3aXRoIGEgZGVmYXVsdCBvZiAwLjUNCg0KYGBge3IgcGxvdF9kYWdfbWF0cml4fQ0KZGFnX3Bsb3RzIDwtIHBsb3RfZGFnX21hdHJpeChkYWdfbWF0cml4LCBzYXZlX3Bsb3RzID0gRikNCmBgYA0KDQoNCiMjIENvbG9waG9uDQoNCmBgYHtyIGNwaG9ufQ0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCiMjIFJlZmVyZW5jZXMNCg0KYGBge3IgY2l0ZX0NCnBhY2thZ2VzICU+JQ0KICBtYXAoY2l0YXRpb24pICU+JQ0KICBwcmludChzdHlsZSA9ICJ0ZXh0IikNCmBgYA0K